const webpack = require('webpack')
const HappyPack = require('happypack')
const path = require('path')
const CopyWebpackPlugin = require("copy-webpack-plugin")
const CleanWebpackPlugin = require('clean-webpack-plugin')

/*
* 定义当前打包环境
* 默认是debug版本，如果传递了参数，那么就是release
* process.env,获取node环境变量中的值
**/
// var isDebug = process.env.NODE_ENV != "release";
var isDebug = true;


// 公用插件
const comment_plugins = [
	
	// new webpack.DefinePlugin({ 'process.env': { NODE_ENV: JSON.stringify(nodeEnv) } }),
    //在编译时出现错误时跳过发布阶段,这样可以确保不会出现包含错误的资产
    new webpack.NoEmitOnErrorsPlugin(),
    // new webpack.NamedModulesPlugin(),

    //删除重复代码
    new webpack.optimize.DedupePlugin(),
    
    //提取这些依赖到共享的 bundle 中，来避免重复打包
    //提取公用文件
    
    /*
    new webpack.optimize.CommonsChunkPlugin({
        names: ["pc/pc-vendor", "pc/pc-vendor-manifest"],
        // filename: 'pc-vendor-[hash].min.js',
        minChunks: Infinity,
        // children: true,
        // async: true,
    })
    */

    // 拷贝文件
    new CopyWebpackPlugin([{
        from: __dirname + '/src/images',
        to: __dirname + '/dist/images/'
    }]),

    new CopyWebpackPlugin([{
        from: __dirname + '/src/index.html',
        to: __dirname + '/dist/'
    }]),
    
    /**/
    //打包scss
	new HappyPack({
      verbose: false,
      id: 'scss',
      threads: 2,
      // loaders: ['style-loader', 'css-loader', 'postcss-loader', 'sass-loader']
      loaders: ['style-loader', 'css-loader', 'sass-loader']
    }),

    //语法检查
    new HappyPack({
      verbose: false,
      id: 'eslint',
      threads: 2,
      loaders: ['eslint-loader']
    }),
    // 打包js
    new HappyPack({
      verbose: false,
      id: 'js',
      threads: 2,
      loaders: ['babel-loader?cacheDirectory']
    })
    
];

//开发中的插件配置
var develop_plugins = [
    // new CleanWebpackPlugin(
    //     ['dist/*'],　 //匹配删除的文件
    //     {
    //         root: __dirname,       　　　　　　　　　　//根目录
    //         verbose:  true,        　　　　　　　　　　//开启在控制台输出信息
    //         dry:      false        　　　　　　　　　　//启用删除文件
    //     }
    // ),
    new webpack.HotModuleReplacementPlugin(),
    // 开启全局的模块热替换（HMR）

    new webpack.NamedModulesPlugin(),
    // 当模块热替换（HMR）时在浏览器控制台输出对用户更友好的模块名字信息
];

//部署时插件配置
var release_plugings = [
    //代码压缩
    new webpack.optimize.UglifyJsPlugin({
      compress: {
        warnings: true
      }
    }),
];

develop_plugins  = develop_plugins.concat(comment_plugins);
release_plugings = release_plugings.concat(comment_plugins);

//导出对象
module.exports = {

	entry: {
        // 'pc/pc-vendor': ['vue', 'vue-router', 'vuex'],
        "index":'./src/index',
    },
    output:{
    	// 输出文件的保存路径
        path: path.join(__dirname, "./dist"),
        //文件的名称，输出的文件名称
        filename: "[name].js",
        //模块文件，按需加载的名字
        chunkFilename: "[name].[chunkhash].js",
        //html的访问资源的路径
        publicPath: isDebug ? "http://localhost:3805/" : "./",

        // library: ["uncleWeb"],
        // libraryTarget: "umd"
    },

    module:{

    	//规则，loader
    	rules:[
    		// vue
    		{
                test: /\.vue$/,
                use:[{
                    loader:"vue-loader",
                    options:{
                        loaders: {
                            scss: 'vue-style-loader!css-loader!sass-loader'
                        }
                    }
                }],
                
            },

    		// js
    		{
    			test:/\.js$/,
    			use:[
                    // "babel-loader",
                    // 'eslint-loader'
                    'happypack/loader?id=js', //js
                    'happypack/loader?id=eslint'//语法检查
                ],
                //排除
                // exclude: ['./node_modules/', './public/pc/lib/'],
                exclude: /(node_modules|lib|utils)/, // do not lint third-party code
    		},
    		// scss
            {
                test: /\.(css|scss)$/,
                use:[
                    // 'style-loader',
                    // 'css-loader',
                    // 'sass-loader'
                    'happypack/loader?id=scss'
                ],
            },
            // img
            {
                test: /\.(jpe?g|png|gif|svg)$/i,
                // test: /\.(png|jpe?g|gif)$/,
		        exclude: [/node_modules/],
                // use: ['url-loader?limit=10000', 'img-loader?progressive=true']
		        use: ['url-loader?limit=1']
            },
            // font
            {
            	test: /\.(eot|svg|ttf|woff|woff2)$/,
            	use: ['file-loader?name=./fonts/[name].[ext]']
        	},
        	// html
            {
                test:/\.html$/,
                use:[
                    'html-loader'
                ],
            },
    	]

    	// rules end！

    },
    //module end！

    plugins: isDebug ? develop_plugins : release_plugings,

    //监听文件变化
    watch: false,

    //定义监听
    watchOptions:{
    	//文件第一次改变，到webpack响应的延迟时间，如果延迟时间中，有新的文件改变，将统一汇聚在一次中响应
    	aggregateTimeout: 300,
		poll: 1000//1秒检查一次
    },

    //源码关联
    devtool: isDebug ? 'source-map' : 'eval',

    //解析
    resolve:{
    	//modules,搜索路径
    	modules:[
    		path.join(__dirname, "./node_modules"),
            path.join(__dirname, "./src"),
            path.join(__dirname, "./libs")
    	],
    	// 默认名称后缀
    	extensions: ['.js','.vue'],
    	//默认文件名称
    	mainFiles: ["index"],
    	//别名
    	alias:{
            'vue$': 'vue/dist/vue.js',
    		'config': path.resolve('./src/config.js'),
    	},
    },

    //webpack-dev-server
    devServer:{
    	contentBase: "./dist/",//web服务器的根目录
        publicPath: "/",//编译后的文件存放位置

        historyApiFallback: true,
        hot: true,//自动刷新
        inline: true,//内联模式，该模式下修改代码后，webpack将自动打包并且刷新浏览器
        // progress: true,
        port: 3805, //端口
        watchOptions         : {
            aggregateTimeout : 300,
            poll             : 1000,
        },
    }
}